/*
 * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package com.nulldev.util.VariableAPI.util.strings.codepoint;

abstract class CharacterData {
	abstract int getProperties(int ch);

	abstract int getType(int ch);

	abstract boolean isWhitespace(int ch);

	abstract boolean isMirrored(int ch);

	abstract boolean isJavaIdentifierStart(int ch);

	abstract boolean isJavaIdentifierPart(int ch);

	abstract boolean isUnicodeIdentifierStart(int ch);

	abstract boolean isUnicodeIdentifierPart(int ch);

	abstract boolean isIdentifierIgnorable(int ch);

	abstract int toLowerCase(int ch);

	abstract int toUpperCase(int ch);

	abstract int toTitleCase(int ch);

	abstract int digit(int ch, int radix);

	abstract int getNumericValue(int ch);

	abstract byte getDirectionality(int ch);

	// need to implement for JSR204
	int toUpperCaseEx(int ch) {
		return toUpperCase(ch);
	}

	char[] toUpperCaseCharArray(int ch) {
		return null;
	}

	boolean isOtherLowercase(int ch) {
		return false;
	}

	boolean isOtherUppercase(int ch) {
		return false;
	}

	boolean isOtherAlphabetic(int ch) {
		return false;
	}

	boolean isIdeographic(int ch) {
		return false;
	}

	// Character <= 0xff (basic latin) is handled by internal fast-path
	// to avoid initializing large tables.
	// Note: performance of this "fast-path" code may be sub-optimal
	// in negative cases for some accessors due to complicated ranges.
	// Should revisit after optimization of table initialization.

	static final CharacterData of(int ch) {
		if (ch >>> 8 == 0) { // fast-path
			return CharacterDataLatin1.instance;
		} else {
			switch (ch >>> 16) { // plane 00-16
				case (0):
					return CharacterData00.instance;
				case (1):
					return CharacterData01.instance;
				case (2):
					return CharacterData02.instance;
				case (14):
					return CharacterData0E.instance;
				case (15): // Private Use
				case (16): // Private Use
					return CharacterDataPrivateUse.instance;
				default:
					return CharacterDataUndefined.instance;
			}
		}
	}
}
